package java_thinking.unit_21._21_3;

/**
 * @Desc:   3-1 在没有同步的情况下共享变量 不要这么做
 * @author: cww
 * @DateTime: 2019/5/30 19:22
 */

public class NoVisibility {
    /**
     * 一下两个域在主线程和 ReaderThread 线程之间共享了，但是没有同步，就存在先后
     * 当线程看到ready变量时，可能会得到一个已经失效的值，除非都使用同步
     */
    private static boolean ready = false;
    private static int number;

    /**
     * 表面上看会输出42，但是可能会输出0，或者根本无法终止
     */
    private static class ReaderThread extends Thread {
        @Override
        public void run() {
            while (!ready)
                System.out.println("线程放弃");
                Thread.yield();
            System.out.println(number);
        }
    }

    /**
     * 主线程
     * @param args
     */
    public static void main(String[] args) throws InterruptedException {
        /**
         * 主线程内启动读线程
         */
        new ReaderThread().start();
        ready = true;
        Thread.sleep(100);
//        Thread.sleep(100);
        number = 42;
        Thread.sleep(100);
    }
}
